/**
 * 类的本质其实就是函数
 * 
 * 类中是严格模式
 */

// 类  class xxxx -> 容器/作用域/模块 -> 壳子
// class Test1 {
//   constructor() {}
//   say() {}
//   static do () {}
// }
// const test1 = new Test1()
// class Test {
//   constructor() {}
//   say() {}
//   static do () {}
// }
// const test = new Test()
// 函数
// function Test2 () { // constructor 指向构造器
// }
// Test2.prototype.say = function () {}
// Test2.do = function () {}

// const Test = (function () {
//   function Test2 () { // constructor 指向构造器
//   }
//   Test2.prototype.say = function () {}
//   Test2.do = function () {}

  // 和class一样只是多了一个这个注册步骤
//   window.Test = Test;
// })();

// const test = new Test()



// class Test {
//   constructor() { // constructor里的方法都为非静态方法
//     // console.log( 'constructor:', this) // {}
//     // 类的非静态方法 -> new(实例化过程中) -> (添加到)this -> {}
//     // 在constructor里给this添加的属性、方法，在实例化过程中，
//     // 当this指向{}时，添加的属性、方法就会放到{}里面
//     this.test = function () {
//       console.log('none-static:', this)
//     }
//   }
//   // 类的静态方法 (严格意义来说是，类的原型上的静态属性)
//   // 类的静态方法 -> Test.prototype{...}
//   // new this -> {} (对象默认的情况下) -> __proto__ -> Test.prototype{test} -> __proto__ -> ... -> Object.prototype
//   // Test -> prototype{} -> test方法
//   // 定义的时候就会在Test的prototype属性这个{}里面 放如定义的这个方法
//   test() {
//     console.log('static:', this)
//   }
// }

// /**
//  * this -> {
//  *  test: function() {}
//  * }
//  */
// const test = new Test();
// // console.log(test) // this -> {}
// test.test(); // this -> {}

// const TestA = Object.create(null);
// console.log(TestA) // No properties
// const TestB = {};
// console.log(TestB) // __proto__





/**
 * 继承
 */

class Father {
  constructor () {
    // new -> this -> {} -> age属性
    // no this binding (this没有绑定，基类(父类)没有实例化)
    console.log('father-this', this)
    this.age = 16;
  }
  swim () {
    console.log('Go swimming', this);
  }
}

class Son extends Father{
  constructor() {
    // 调用Father上的constructor
    // 相当于，生成this绑定 -> Father this -> Son的实例
    // 当前this -> new Father() -> {}
    super();
    this.hobby = 'study'
    console.log('son-constructor', this) // { age, hobby }
  }
  study () {
    this.swim(); // Go swimming Son {}
    // son-this Son {} -> __proto__ -> __proto__ -> swim()
    console.log('son-study-this', this);
  }
}

// const father = new Father();
// father.swim()
const son = new Son();
son.study()





